package com.gitee.deament.server.core.cli.db.hash;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * HGET hash field
 * 可用版本： >= 2.0.0
 * 时间复杂度： O(1)
 * 返回哈希表中给定域的值。
 *
 * 返回值
 * HGET 命令在默认情况下返回给定域的值。
 *
 * 如果给定域不存在于哈希表中， 又或者给定的哈希表并不存在， 那么命令返回 nil 。
 * @author deament
 */
@CliHander(command = "HGET")
public class HGETcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> values = getValues(command);
        if (values.size() != 3) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'HGET' command"));
            return;
        }
        String hash = values.get(1);
        String field = values.get(2);

        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        Value<Map<String, String>> hashData = SystemConfig.dbData.getHashData(db, hash);
        String value = hashData.getValue().get(field);
        if (value == null) {
            channelHandlerContext.channel().writeAndFlush("nil");
            return;
        }
        Date date = hashData.getExpirDateTime();
        if ((date.compareTo(new Date())) <= 0) {
            channelHandlerContext.channel().writeAndFlush("nil");
            return;
        }
        channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(value));
    }
}
